package TablaDeSimbolos;

import TokensDelLenguaje.Token;
import TokensDelLenguaje.Token_Struct;
import TokensDelLenguaje.Tokens;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Collection;
import java.util.Iterator;

public final class TSimbolo {
  private Hashtable<String, Token> tabla;

  /*HH aca guardaria por nombre , no Token*/
  public TSimbolo() {
    tabla = new Hashtable<String, Token>();
  }

  public void put(Token tk) {
    if(!tabla.containsKey(tk.getCadena())) {
       tabla.put(tk.getCadena(), tk);
    }
  }
  public Token get(String nombreToken) {
    return tabla.get(nombreToken);
  }
  public Collection<Token> values() {
    return tabla.values();
  }
  
  public boolean set(Token tk){
     boolean mensajeError = true;
      //elimino el identificador sin tipo y lo actualizo por identificador + tipo : por ejemplo una varialbe (nombre + tipo)
      /*Aca va el control que si ya existe un varible declarada con un tipo y quiero 
       * declararla con otro, entonces tiro el error, estaba bien como lo hice antes 
       * pero me falto que en el if pregunte por el tipo ID sobre el elemento de la tabla,
       * no el que estoy pasando como parametro ahi le estaba errando, seguir con esto!!!!*/
      
      Token tk_ElementoEnTabla = this.tabla.get(tk.getCadena());
      
      if (this.tabla.containsKey(tk.getCadena()) && tk_ElementoEnTabla.getId().equals(Tokens.identificador)){
          this.tabla.remove(tk.getCadena());
          this.tabla.put(tk.getCadena(), tk);
          mensajeError = false;
      }else{
                if (!tk.getId().equals(Tokens.identificador)){
                    mensajeError = true;
                }
      }
      
      /*if (this.tabla.containsKey(tk.getCadena()) && tk.getId().equals(Tokens.identificador)){
            
           }*/
       /* else{
                if (!tk.getId().equals(Tokens.identificador)){
                    mensajeError = true;
                }
            }*/
      //this.tabla.put(tk.getCadena(), tk);
      return mensajeError;
} 
  
  public void vaciar(){
      tabla = new Hashtable<String, Token>();
  }
  
  public boolean existeToken(String nombre){
      return this.tabla.containsKey(nombre);
  }
  
  public void eliminarTokens(ArrayList tks){    
      for(Iterator it = tks.iterator(); it.hasNext();){
          Token tk= (Token)it.next();
          this.tabla.remove(tk.getCadena());   
      } 
  }

    public void clean() {
        
        for (Enumeration<Token> elements = this.tabla.elements();elements.hasMoreElements();){
            Token tk = elements.nextElement();
            if (tk.getId().equals(Tokens.identificador)){
                this.tabla.remove(tk.getCadena());
            }
        }
        
        }

    public boolean existeToken(String cad1, String cad2) {
        if(this.tabla.containsKey(cad1)){
            Token t = tabla.get(cad1);
            Token tk = ((Token_Struct)t).getElementos(cad2);
            if(tk != null)
                return true;
        }
        return false;
    }

    public Token get(String cad1, String cad2) {
        Token_Struct ts = (Token_Struct) this.tabla.get(cad1);
        Token t = null;
        for(int i=0; i<ts.getElementos().size(); i++){
            if(ts.getElementos().get(i).getCadena().equals(cad2))
                t = ts.getElementos().get(i);
        }
        return t;        
    }
      
  
}
